package com.juneng.quartz;

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @ClassName SchedulerService.java
 * @Description 功能描述：
 * @author 吴昊 2017年12月11日 下午7:07:21

 */
@Service
public class SchedulerService {

    @Autowired
    private Scheduler scheduler;

    /**
     * @Description 方法描述： 新增job任务
     * @author 吴昊 2017年12月11日 下午8:09:50

     * @param jobName 任务名称
     * @param jobGroupName 任务组名
     * @param triggerName 触发器名称
     * @param triggerGroupName 触发器组名
     * @param jobClass
     * @param cron
     * @throws Exception
     */
    public void addJobCron(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
                           Class jobClass, String cron) throws Exception {
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);

        // 任务触发
        scheduler.getTrigger(triggerKey);
        Trigger trigger;
        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();

        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        trigger = TriggerBuilder.newTrigger().withIdentity(triggerName,
                                                           triggerGroupName).withSchedule(cronScheduleBuilder.withMisfireHandlingInstructionDoNothing()).build();
        scheduler.scheduleJob(jobDetail, trigger);

    }

    /**
     * @Description 方法描述： 删除job任务，删除任务后，所对应的trigger也将被删除
     * @author 吴昊 2017年12月11日 下午8:09:36

     * @param jobName
     * @param jobGroupName
     * @throws Exception
     */
    public void deleteJob(String jobName, String jobGroupName) throws Exception {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
        scheduler.pauseJob(jobKey);// 先暂停任务
        scheduler.deleteJob(jobKey);// 再删除任务
    }

    /**
     * @Description 方法描述： 更新job任务
     * @author 吴昊 2017年12月11日 下午8:09:17

     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     * @param jobClass
     * @param cron
     * @throws Exception
     */
    public void updateJobCron(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
                              Class jobClass, String cron) throws Exception {
        this.deleteJob(jobName, jobGroupName);
        this.addJobCron(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
    }

    /**
     * @Description 方法描述：暂停一个job
     * @author 吴昊 2018年4月11日 上午9:50:59

     * @param jobName
     * @param jobGroupName
     * @throws Exception
     */
    public void pauseJob(String jobName, String jobGroupName) throws Exception {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
        scheduler.pauseJob(jobKey);
    }

    /**
     * @Description 方法描述：恢复一个job
     * @author 吴昊 2018年4月11日 上午9:50:41

     * @param jobName
     */
    public void resumeJob(String jobName, String jobGroupName) throws Exception {
        JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
        scheduler.resumeJob(jobKey);
    }
}
